home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1995 October
/
EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso
/
Aminet
/
misc
/
emu
/
prlink_amiga.lha
/
prlink-0.8.0a
/
src
/
prtrans2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-06
|
4KB
|
241 lines
#ifdef __linux__
#include <signal.h>
#include <unistd.h>
#include <asm/io.h>
#endif /* __linux__ */
#include "prtrans.h"
unsigned baseaddr, stataddr;
#ifdef __linux__
static void cleanup (int i);
static void cleanup (int i) {
outb(0, baseaddr); /* this ensures that the server doesn't remain blocked */
exit(-1);
}
#endif /* __linux__ */
int prinit (void) {
#ifdef __linux__
if (ioperm (baseaddr, 2, 1))
return -1;
signal(SIGTERM, cleanup);
#endif /* __linux__ */
outb(0, baseaddr);
stataddr = baseaddr + 1;
return 0;
}
void prclose (void) {
outb(0, baseaddr);
}
void output (unsigned char byte) {
send (&byte, 1);
}
unsigned input (void) {
unsigned char byte;
receive (&byte, 1);
return byte;
}
unsigned wait_input (void) {
register unsigned char data;
outb(0xf0, baseaddr);
while(0x20 & inb(stataddr))
usleep (SLEEP_TIME);
outb(0, baseaddr);
while(!(0x20 & inb(stataddr)));
data = (0xc0 & inb(stataddr)) >> 6;
outb(8, baseaddr);
while(0x20 & inb(stataddr));
data |= (0xc0 & inb(stataddr)) >> 4;
outb(0, baseaddr);
while(!(0x20 & inb(stataddr)));
data |= (0xc0 & inb(stataddr)) >> 2;
outb(8, baseaddr);
while(0x20 & inb(stataddr));
data |= 0xc0 & inb(stataddr);
outb(0, baseaddr);
while(!(0x20 & inb(stataddr)));
return data ^ 0xaa;
}
#if !defined(__i386__) && !defined(__GNU_C__)
void send (unsigned char *buffer, unsigned length) {
while (length--) {
outb(*buffer | 8, baseaddr);
while(0x20 & inb(stataddr));
outb(*buffer++ << 4, baseaddr);
while(!(0x20 & inb(stataddr)));
}
}
#else /* __i386__ && __GNU_C__ */
void send (unsigned char *buffer, unsigned length) {
asm ("push %%ebp
movw _baseaddr,%%dx
movl %1,%%ecx
movl %0,%%ebp
sloop: movb (%%ebp),%%al
orb $8,%%al
outb %%al,%%dx
incw %%dx
wait1:
inb %%dx,%%al
testb $32,%%al
jne wait1
movb %0,%%al
salb $4,%%al
decw %%dx
outb %%al,%%dx
incw %%dx
wait2:
inb %%dx,%%al
testb $32,%%al
je wait2
decw %%dx
inc %%ebp
loop sloop
pop %%ebp"
: /* no outputs */
: "g" (buffer), "g" (length)
: "al", "ecx", "dx");
}
#endif /* __i386__ && __GNU_C__ */
#if !defined(__i386__) && !defined(__GNU_C__)
void receive (unsigned char *buffer, unsigned length) {
register unsigned char data;
while (length--) {
outb(0xf0, baseaddr);
while(0x20 & inb(stataddr));
outb(0, baseaddr);
while(!(0x20 & inb(stataddr)));
data = (0xc0 & inb(stataddr)) >> 6;
outb(8, baseaddr);
while(0x20 & inb(stataddr));
data |= (0xc0 & inb(stataddr)) >> 4;
outb(0, baseaddr);
while(!(0x20 & inb(stataddr)));
data |= (0xc0 & inb(stataddr)) >> 2;
outb(8, baseaddr);
while(0x20 & inb(stataddr));
data |= 0xc0 & inb(stataddr);
outb(0, baseaddr);
*buffer++ = data ^ 0xaa;
while(!(0x20 & inb(stataddr)));
}
}
#else /* __i386__ && __GNU_C__ */
void receive (unsigned char *buffer, unsigned length) {
asm ("movw _baseaddr,%%dx
push %%ebp
movl %1,%%ecx
movl %0,%%ebp
rloop: movb $0xf0,%%al
outb %%al,%%dx
incw %%dx
input0:
inb %%dx,%%al
testb $32,%%al
jne input0
decw %%dx
xorb %%al,%%al
outb %%al,%%dx
incw %%dx
input1:
inb %%dx,%%al
testb $32,%%al
je input1
decw %%dx
andb $0xc0,%%al
shrb $6,%%al
mov %%al,(%%ebp)
movb $8,%%al
outb %%al,%%dx
incw %%dx
input2:
inb %%dx,%%al
testb $32,%%al
jne input2
decw %%dx
andb $0xc0,%%al
shrb $4,%%al
orb %%al,(%%ebp)
xorb %%al,%%al
outb %%al,%%dx
incw %%dx
input3:
inb %%dx,%%al
testb $32,%%al
je input3
decw %%dx
andb $0xc0,%%al
shrb $2,%%al
orb %%al,(%%ebp)
movb $8,%%al
outb %%al,%%dx
incw %%dx
input4:
inb %%dx,%%al
testb $32,%%al
jne input4
decw %%dx
andb $0xc0,%%al
orb %%al,(%%ebp)
xorb $0xaa,(%%ebp)
xorb %%al,%%al
outb %%al,%%dx
incw %%dx
input5:
inb %%dx,%%al
testb $32,%%al
je input5
decw %%dx
inc %%ebp
loop rloop
pop %%ebp"
: /* no outputs */
: "g" (buffer), "g" (length)
: "ax", "cx", "dx");
}
#endif /* __i386__ && __GNU_C__ */